# -*- coding: utf-8 -*-
# Create your views here.
from buscador.forms import DetalleBuscarForm
from detalles_especie.forms import DetalleEspecieForm
from detalles_especie.models import DetalleEspecie, FechaCreacion
from detalles_region.models import DetalleRegion
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.context_processors import csrf
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from django.views.generic.create_update import update_object, create_object, delete_object
from django.views.generic.list_detail import object_list, object_detail
from documentos.models import Documento
from expertos.models import Experto
from instituciones.models import Institucion
from proyectos.models import Proyecto
from publicaciones.models import Publicacion
from usuarios.permisos import es_del_grupo_de_expertos, es_del_grupo_de_admins


"""
Solo el experto puede crear una especie. 
El visitante no puede ver el detalle de la especie, solo listar. 
El usuario puede ver y listar. Solo el admin puede editar el detalle de la especie
"""


def listar(request):    #seria la pagina de inicio para las especies
    return object_list(request,
                       queryset = DetalleEspecie.objects.filter(aprobado=True),
                       paginate_by = 6,
                       allow_empty = True,
                       extra_context = {'ordenar_por':'todo'},
                       template_name = 'detalles_especie/listar.html'
                       )




def listar_por_ordenar(request,ordenar_por):    #seria la pagina de inicio para las datoTaxs
    q = DetalleEspecie.objects.filter(aprobado=True)    
    if ordenar_por == 'nombre':
        q = q.order_by('nombre')
    if ordenar_por == 'datos':
        q = q.order_by('datos')
    if ordenar_por == 'estado':
        q = q.order_by('estado')
    if ordenar_por == 'tipo_migracion':
        q = q.order_by('tipo_migracion')
    return object_list(request,
                       queryset = q,
                       paginate_by = 6,
                       allow_empty = True,
                       template_name = 'detalles_especie/listar.html',
                       extra_context = {'ordenar_por':ordenar_por}
                       )




def filtrar(request):    #seria la pagina de inicio para las especies
    form = DetalleBuscarForm()
    q = None
    if request.method == 'POST':
        form = DetalleBuscarForm(request.POST)
        if form.is_valid():
            q = DetalleEspecie.objects.filter(nombre__icontains = form.cleaned_data['nombre_busqueda'] ) 
    return object_list(request,
                       queryset = DetalleEspecie.objects.all(),
                       allow_empty = True,
                       extra_context = {'form' : form, 'detalles' : q },
                       template_name = 'detalles_especie/filtrar.html'
                       )

@login_required
def ver(request, object_id):
    c = {}
    objetos_relacionados = {}
    detalle = get_object_or_404(DetalleEspecie, pk=object_id)
    if not detalle.aprobado:
        c.update({'titulo_error' : u'No se puede ver el Detalle de Especie.'})
        c.update({'error' : u'El Detalle de especie no tiene aprobación.'})
        c.update(csrf(request))
        return render_to_response("detalles_especie/error.html", c,context_instance=RequestContext(request))                     
    regiones = DetalleRegion.objects.filter(especie = detalle)
    objetos_relacionados.update({'regiones' : regiones })
    if detalle.datos:
        expertos = Experto.objects.filter(datos = detalle.datos)
        instituciones = Institucion.objects.filter(dato = detalle.datos)
        proyectos = Proyecto.objects.filter(datos = detalle.datos)
        documentos = Documento.objects.filter(datos = detalle.datos)
        publicaciones = Publicacion.objects.filter(datos = detalle.datos)
        objetos_relacionados.update({'instituciones' : instituciones })
        objetos_relacionados.update({'expertos' : expertos })
        objetos_relacionados.update({'proyectos' : proyectos })
        objetos_relacionados.update({'documentos' : documentos })
        objetos_relacionados.update({'publicaciones' : publicaciones })
        
     
    return object_detail(request,
                         queryset = DetalleEspecie.objects.all(),
                         template_object_name =  "DetalleEspecie",
                         extra_context = objetos_relacionados,
                         template_name = 'detalles_especie/detalle.html',
                         object_id = object_id
                         ) 


@login_required
@user_passes_test(es_del_grupo_de_admins,login_url='/accounts/signin/no_admin')
def aprobar(request):    #seria la pagina de inicio para las especies
    return object_list(request,
                       queryset = DetalleEspecie.objects.filter(aprobado = False),
                       allow_empty = True,
                       template_name = 'detalles_especie/aprobar.html'
                       )


@login_required
@user_passes_test(es_del_grupo_de_admins,login_url='/accounts/signin/no_admin')
def aprobar_confirmar(request,object_id):    #seria la pagina de inicio para las especies
    c = {}
    especie = get_object_or_404(DetalleEspecie,pk=object_id)
    c.update(csrf(request))
    c.update({'especie':especie})
    return render_to_response('detalles_especie/aprobar_confirmar.html',c,context_instance=RequestContext(request))



@login_required
@user_passes_test(es_del_grupo_de_admins,'/accounts/signin/no_admin')    
def aprobar_confirmar_form(request,object_id):    #seria la pagina de inicio para las expertos
    c = {}
    detalle = get_object_or_404(DetalleEspecie,pk=object_id)
    c.update(csrf(request))
    c.update({'detalle':detalle})
    if request.method == 'POST':
        form = DetalleEspecieForm(request.POST,request.FILES,instance = detalle)
        if form.is_valid():
            new_experto = form.save(commit=False)
            new_experto.aprobado = True
            new_experto = form.save()
            return HttpResponseRedirect('/especies/' + str(new_experto.pk))
        c.update({'form':form})
    else:
        form = DetalleEspecieForm(instance = detalle)    
        c.update({'form':form})
        
    return render_to_response('detalles_especie/form_aprobar.html',c,context_instance=RequestContext(request))
     
        
@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def crear_con_experto(request):
    c={}
    if request.method == 'POST':                            
        form = DetalleEspecieForm(request.POST,request.FILES)                                                 
        if form.is_valid():
            new_detalle = form.save(commit=False)
            try: 
                new_detalle.creador = request.user.get_profile().experto
                new_detalle.aprobado = False
                new_fecha = FechaCreacion()
                new_detalle.save() 
                new_fecha.especie = new_detalle
                new_fecha.save()
                form.save_m2m()
            except:
                c.update({'error' : u'No tiene perfil de Experto, no se pudo crear el detalle.'})
                c.update(csrf(request))
                c.update({'form':form}) 
                return render_to_response("detalles_especie/error.html", c,context_instance=RequestContext(request))                                   
            c.update({'error' : u'El Detalle de la nueva Especie ha sido creada con éxito, necesita aprobación del administrador para mostrarse.'})
            c.update(csrf(request))            
            return render_to_response("detalles_especie/recien_creado.html", c,context_instance=RequestContext(request))
    else:
        form = DetalleEspecieForm()
                      
    c.update(csrf(request))
    c.update({'form':form})                  
    return render_to_response("detalles_especie/crear.html", c,context_instance=RequestContext(request))    


@login_required
#@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def crear(request):    
    return create_object(request, 
                         model = DetalleEspecie,
                         form_class = DetalleEspecieForm,
                         template_name = 'detalles_especie/crear.html',
                         post_save_redirect = '/especies/'
                         )     



@login_required
@user_passes_test(es_del_grupo_de_admins,login_url='/accounts/signin/no_admin')
def editar(request, object_id):
    get_object_or_404(DetalleEspecie, pk=object_id)
    return update_object(request,
                         model = DetalleEspecie,
                         form_class = DetalleEspecieForm, 
                         template_name = 'detalles_especie/editar.html', 
                         post_save_redirect = '/especies/' + object_id,
                         object_id = object_id
                         )


@login_required
@user_passes_test(es_del_grupo_de_expertos,login_url='/accounts/signin/no_experto')
def eliminar(request, object_id):
    get_object_or_404(DetalleEspecie, pk=object_id)
    return delete_object(request,
                         model = DetalleEspecie, 
                         template_name = 'detalles_especie/confirmar_eliminar.html', 
                         post_delete_redirect = '/especies/',
                         object_id = object_id
                         )
